# _*_ coding: UTF-8 _*_
# @Time     : 2021/2/23 下午 04:25
# @Author   : Li Jie
# @Site     : http://www.hzdledu.com/
# @File     : process_test3.py
# @Software : PyCharm

from multiprocessing import Process
import time
import os


# 继承Process类
class SubProcess(Process):
    # 相当于重写父类的构造方法
    def __init__(self, interval, name=''):
        Process.__init__(self)  # 显式调用父类构造方法
        self.interval = interval  # 接收参数interval间隔时间
        if name:  # 判断子进程名是否存在
            self.name = name  # 如果指定子进程名，则给name属性赋值，否则会使用系统默认值process-n

    # 覆盖父类的run()方法，当实例化本类对象没有指定target调用方法时会调用此方法
    def run(self):
        print(f'子进程{os.getpid()}开始执行，父进程为{os.getppid()}')
        t_start = time.time()  # 记录子进程开始时间
        time.sleep(self.interval)  # 子进程会被暂停interval秒
        t_end = time.time()  # 记录子进程结束时间
        print(f'子进程{os.getpid()}结束执行，执行时间为:{t_end - t_start:.2f}秒')


def process_main():
    print('-------------父进程开始执行-------------')
    print(f'父进程PID:{os.getpid()}')  # 打印主进程PID
    p1 = SubProcess(interval=1, name='hzdl')
    p2 = SubProcess(interval=2)
    # 启动p1和p2子进程
    p1.start()
    p2.start()
    # 同时父进程继续往下执行，如果p1、p2进程还在执行，将会返回True
    print(f'p1还在执行:{p1.is_alive()}')
    print(f'p2还在执行:{p2.is_alive()}')
    # 输出p1和p2进程的名字和PID
    print(f'p1:{p1.name}:{p1.pid}')
    print(f'p2:{p2.name}:{p2.pid}')
    # 等待子进程结束
    p1.join()  # 等待p1子进程结束
    p2.join()  # 等待p2子进程结束
    print('-------------父进程结束执行-------------')


if __name__ == '__main__':
    process_main()
